/**
 * @param {string} phoneNumber 用户号码（需为字符串类型，避免数字截取异常）
 * @returns {string} 生成的 USIED（4位随机字母 + 手机号后4位）
 */
const crypto = require('crypto'); // 引入 crypto 模块（Node.js 内置，无需额外安装）

function generateString(phoneNumber) {
  // 1. 增加参数校验，确保输入合法
  if (!phoneNumber || typeof phoneNumber !== 'string' || !/^1\d{10}$/.test(phoneNumber)) {
    throw new Error('参数错误：phoneNumber 必须是有效的中国大陆手机号字符串（11位数字）');
  }

  // 2. 对手机号进行 MD5 哈希处理（确保同一手机号生成固定的哈希值）
  const md5Hash = crypto.createHash('md5');
  const hashResult = md5Hash.update(phoneNumber).digest('hex'); // 生成 32 位小写哈希值

  // 3. 截取哈希值前 16 位（避免 userId 过长，同时保证唯一性）
  const shortHash = hashResult.slice(0, 8);

  // 4. 增加固定前缀（可选，用于区分用户 ID 类型，如 USER_）
  const userId = `U${shortHash}`;

  return userId;
}
/**
 * 将经纬度坐标编码成网格ID (例如: "116.397_39.908")
 * @param {Object} location - 包含 longitude 和 latitude 的对象
 * @returns {string} - 网格ID
 */
function getGridCode(location) {
  // 确保经纬度是数字
  const longitude = parseFloat(location.longitude);
  const latitude = parseFloat(location.latitude);

  // 检查经纬度是否有效
  if (isNaN(longitude) || isNaN(latitude)) {
    throw new Error("无效的经纬度坐标");
  }

  // 将经纬度四舍五入到小数点后三位，然后格式化为字符串
  const lonPart = longitude.toFixed(3);
  const latPart = latitude.toFixed(3);

  return `${lonPart}_${latPart}`;
}

/**
 * 获取中心网格周围指定半径范围内的所有网格ID
 * @param {string} centerGrid - 中心网格的ID (例如: "116.397_39.908")
 * @param {number} radius - 搜索半径（单位：个网格）
 * @returns {string[]} - 周围网格ID的数组
 */
function getSurroundingGrids(centerGrid, radius) {
  const [lonStr, latStr] = centerGrid.split('_');
  let centerLon = parseFloat(lonStr);
  let centerLat = parseFloat(latStr);

  // 检查中心网格ID是否有效
  if (isNaN(centerLon) || isNaN(centerLat)) {
    throw new Error("无效的中心网格ID");
  }

  const grids = new Set();

  // 遍历以中心网格为原点，半径为radius的正方形区域
  for (let x = -radius; x <= radius; x++) {
    for (let y = -radius; y <= radius; y++) {
      // --- 优化点：欧几里得距离过滤 ---
      // 计算当前偏移量(x, y)对应的欧几里得距离
      // 因为每个网格的边长是固定的(0.001度)，所以可以省略乘以网格边长的步骤，直接比较偏移量的距离
      const distance = Math.sqrt(x * x + y * y);
      
      // 只保留距离小于等于半径的网格
      if (distance > radius) {
        continue; // 跳过这个网格
      }
      // ---------------------------------

      let targetLon = centerLon + x * 0.001;
      let targetLat = centerLat + y * 0.001;

      // 处理经度环绕（-180° 到 180°）
      if (targetLon < -180) targetLon += 360;
      else if (targetLon > 180) targetLon -= 360;

      // 处理纬度边界（-90° 到 90°）
      targetLat = Math.max(-90, Math.min(90, targetLat));

      const location = { longitude: targetLon, latitude: targetLat };

      grids.add(getGridCode(location));
    }
  }

  // 将Set转换为数组并返回
  return Array.from(grids);
}





module.exports = {
generateString,
getGridCode,
getSurroundingGrids
}
